import {observable, action, configure, toJS} from 'mobx';
import Login from './modules/Login';
import Order from './modules/Order';

//启用严格模式。严格模式下，只能通过action来修改state。默认状态下，可以直接修改。
configure({enforceActions: 'observed'});

/**
 * 根Store：用于创建单一Store
 */
export default class Store {
  /**
   * 构造函数
   * @param isInit 是否根据sessionStorage初始化状态
   */
  constructor(isInit = true) {
    let keys = Object.keys(toJS(this)); //根Store自身状态的key

    this.order = new Order(); //子Store
    this.login = new Login(); //子Store

    this.initState(keys, isInit); //根据sessionStorage初始化状态
  }

  //@observable修饰器用来声明需要观察的属性。当该属性变化后，对应的View也会刷新。
  @observable routerData = {}; //当前路由信息
  @observable routerMenu = {}; //左侧菜单的路由列表
  @observable routerFormat = {}; //格式化的路由列表

  //@observable修饰器用来声明action：用来修改state。严格模式下，只能通过action来修改state。
  @action setRouterData = (value) => {
    this.routerData = value;
  };
  @action setRouterMenu = (value) => {
    this.routerMenu = value;
  };
  @action setRouterFormat = (value) => {
    this.routerFormat = value;
  };

  /**
   * 初始化Store状态
   * 注意：只支持对两层数据接口的Store初始化
   * @param keys 根Store自身状态的key
   * @param isInit 是否根据sessionStorage初始化状态
   */
  initState(keys, isInit) {
    let data = JSON.parse(sessionStorage.getItem('store')); //保存在sessionStorage里的状态信息
    if (!data || !isInit) return;

    Object.keys(data).forEach((key) => {
      let item = data[key];
      //初始化根Store自身状态
      if (keys.includes(key)) {
        this[key] = item;
        return;
      }

      //初始化子Store的状态
      Object.keys(item).forEach((key2) => {
        if (this[key]) this[key][key2] = item[key2];
      });
    });
  }

  /**
   * 保存Store状态：保存在sessionStorage里
   */
  saveState() {
    //注意：Store不能直接转JSON，需要先使用toJS函数转换
    let data = toJS(this);
    sessionStorage.setItem('store', JSON.stringify(data));
  }
}
